<html>
 <head>
  <meta charset="utf-8"/>
  <meta content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" name="viewport"/>
  <title>
   利用图片指纹检测高相似度图片  | 数螺 | NAUT IDEA
  </title>
  <link href="http://cdn.bootcss.com/bootstrap/3.3.6/css/bootstrap-theme.min.css" rel="stylesheet"/>
  <link href="http://cdn.bootcss.com/bootstrap/3.3.6/css/bootstrap.min.css" rel="stylesheet"/>
  <style type="text/css">
   #xmain img {
                  max-width: 100%;
                  display: block;
                  margin-top: 10px;
                  margin-bottom: 10px;
                }

                #xmain p {
                    line-height:150%;
                    font-size: 16px;
                    margin-top: 20px;
                }

                #xmain h2 {
                    font-size: 24px;
                }

                #xmain h3 {
                    font-size: 20px;
                }

                #xmain h4 {
                    font-size: 18px;
                }


                .header {
	           background-color: #0099ff;
	           color: #ffffff;
	           margin-bottom: 20px;
	        }

	        .header p {
                  margin: 0px;
                  padding: 10px 0;
                  display: inline-block;  
                  vertical-align: middle;
                  font-size: 16px;
               }

               .header a {
                 color: white;
               }

              .header img {
                 height: 25px;
              }
  </style>
  <script src="http://cdn.bootcss.com/jquery/3.0.0/jquery.min.js">
  </script>
  <script src="http://nautstatic-10007657.file.myqcloud.com/static/css/readability.min.js" type="text/javascript">
  </script>
  <script type="text/javascript">
   $(document).ready(function() {
                 var loc = document.location;
                 var uri = {
                  spec: "http://dataunion.org/14960.html",
                  host: "http://dataunion.org",
                  prePath: "http://dataunion.org",
                  scheme: "http",
                  pathBase: "http://dataunion.org/"
                 };
    
                 var documentClone = document.cloneNode(true);
                 var article = new Readability(uri, documentClone).parse();
     
                 document.getElementById("xmain").innerHTML = article.content;
                });
  </script>
  <!-- 1466459528: Accept with keywords: (title(0.0):利用,社区,数盟,指纹,图片, topn(0.266666666667):社区,路径,数盟,行业资讯,色情图片,汉明,视觉,硬盘,文件,数据库,图片集,键值,计算,文章,数据,图片,python,用户,问题,算法,随机,哈希,用户量,网站,代码,指纹,内容,备份,识别,约会).-->
 </head>
 <body onload="">
  <div class="header">
   <div class="container">
    <div class="row">
     <div class="col-xs-6 col-sm-6 text-left">
      <a href="/databee">
       <img src="http://nautidea-10007657.cos.myqcloud.com/logo_white.png"/>
      </a>
      <a href="/databee">
       <p>
        数螺
       </p>
      </a>
     </div>
     <div class="hidden-xs col-sm-6 text-right">
      <p>
       致力于数据科学的推广和知识传播
      </p>
     </div>
    </div>
   </div>
  </div>
  <div class="container text-center">
   <h1>
    利用图片指纹检测高相似度图片
   </h1>
  </div>
  <div class="container" id="xmain">
   ﻿﻿
   <title>
    利用图片指纹检测高相似度图片 | 数盟社区
   </title>
   <!-- All in One SEO Pack 2.2.7.6.2 by Michael Torbert of Semper Fi Web Design[32,61] -->
   <!-- /all in one seo pack -->
   <!--
<div align="center">
<a href="http://strata.oreilly.com.cn/hadoop-big-data-cn?cmp=mp-data-confreg-home-stcn16_dataunion_pc" target="_blank"><img src="http://dataunion.org/wp-content/uploads/2016/05/stratabj.jpg"/ ></a>
</div>
-->
   <header id="header-web">
    <div class="header-main">
     <hgroup class="logo">
      <h1>
       <a href="http://dataunion.org/" rel="home" title="数盟社区">
        <img src="http://dataunion.org/wp-content/themes/yzipi/images/logo.png"/>
       </a>
      </h1>
     </hgroup>
     <!--logo-->
     <nav class="header-nav">
      <ul class="menu" id="menu-%e4%b8%bb%e8%8f%9c%e5%8d%95">
       <li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-has-children menu-item-71" id="menu-item-71">
        <a href="http://dataunion.org/category/events" title="events">
         活动
        </a>
        <ul class="sub-menu">
         <li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-22457" id="menu-item-22457">
          <a href="http://dataunion.org/2016timeline">
           2016档期
          </a>
         </li>
         <li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-22459" id="menu-item-22459">
          <a href="http://dataunion.org/category/parterc">
           合作会议
          </a>
         </li>
        </ul>
       </li>
       <li class="menu-item menu-item-type-taxonomy menu-item-object-category current-post-ancestor current-menu-parent current-post-parent menu-item-has-children menu-item-20869" id="menu-item-20869">
        <a href="http://dataunion.org/category/tech" title="articles">
         文章
        </a>
        <ul class="sub-menu">
         <li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-20867" id="menu-item-20867">
          <a href="http://dataunion.org/category/tech/base" title="base">
           基础架构
          </a>
         </li>
         <li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-3302" id="menu-item-3302">
          <a href="http://dataunion.org/category/tech/ai" title="ai">
           人工智能
          </a>
         </li>
         <li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-3303" id="menu-item-3303">
          <a href="http://dataunion.org/category/tech/analysis" title="analysis">
           数据分析
          </a>
         </li>
         <li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-21920" id="menu-item-21920">
          <a href="http://dataunion.org/category/tech/dm">
           数据挖掘
          </a>
         </li>
         <li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-3314" id="menu-item-3314">
          <a href="http://dataunion.org/category/tech/viz" title="viz">
           可视化
          </a>
         </li>
         <li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-3305" id="menu-item-3305">
          <a href="http://dataunion.org/category/tech/devl" title="devl">
           编程语言
          </a>
         </li>
        </ul>
       </li>
       <li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-has-children menu-item-20876" id="menu-item-20876">
        <a href="http://dataunion.org/category/industry">
         行业
        </a>
        <ul class="sub-menu">
         <li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-16328" id="menu-item-16328">
          <a href="http://dataunion.org/category/industry/case" title="case">
           行业应用
          </a>
         </li>
         <li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-2112" id="menu-item-2112">
          <a href="http://dataunion.org/category/industry/demo" title="demo">
           Demo展示
          </a>
         </li>
         <li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-21562" id="menu-item-21562">
          <a href="http://dataunion.org/category/industry/news">
           行业资讯
          </a>
         </li>
        </ul>
       </li>
       <li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-311" id="menu-item-311">
        <a href="http://dataunion.org/category/sources" title="sources">
         资源
        </a>
       </li>
       <li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-20870" id="menu-item-20870">
        <a href="http://dataunion.org/category/books" title="book">
         图书
        </a>
       </li>
       <li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-21363" id="menu-item-21363">
        <a href="http://dataunion.org/category/training">
         课程
        </a>
       </li>
       <li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-has-children menu-item-21853" id="menu-item-21853">
        <a href="http://dataunion.org/category/jobs">
         职位
        </a>
        <ul class="sub-menu">
         <li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-22050" id="menu-item-22050">
          <a href="http://dataunion.org/category/career">
           职业规划
          </a>
         </li>
        </ul>
       </li>
      </ul>
     </nav>
     <!--header-nav-->
    </div>
   </header>
   <!--header-web-->
   <div id="main">
    <div id="soutab">
     <form action="http://dataunion.org/" class="search" method="get">
     </form>
    </div>
    <div id="container">
     <nav id="mbx">
      当前位置：
      <a href="http://dataunion.org">
       首页
      </a>
      &gt;
      <a href="http://dataunion.org/category/tech">
       文章
      </a>
      &gt;  正文
     </nav>
     <!--mbx-->
     <article class="content">
      <header align="centre" class="contenttitle">
       <div class="mscc">
        <h1 class="mscctitle">
         <a href="http://dataunion.org/14960.html">
          利用图片指纹检测高相似度图片
         </a>
        </h1>
        <address class="msccaddress ">
         <em>
          1,566 次阅读 -
         </em>
         <a href="http://dataunion.org/category/tech" rel="category tag">
          文章
         </a>
        </address>
       </div>
      </header>
      <div class="content-text">
       <p>
        <img src="http://dataunion.org/wp-content/uploads/2015/04/6941baebgw1er4astznv8j21040abmxx.jpg"/>
       </p>
       <p>
        大概五年前吧，我那时还在为一家约会网站做开发工作。他们是早期创业公司，但他们也开始拥有了一些稳定用户量。不像其他约会网站，这家公司向来以洁身自好为主要市场形象。它不是一个供你鬼混的网站——是让你能找到忠实伴侣的地方。
       </p>
       <p>
        由于投入了数以百万计的风险资本（在US大萧条之前），他们关于真爱并找寻灵魂伴侣的在线广告势如破竹。Forbes(福布斯，美国著名财经杂志)采访了他们。全国性电视节目也对他们进行了专访。早期的成功促成了事业起步时让人垂涎的指数级增长现象——他们的用户数量以每月加倍的速度增长。对他们而言，一切都似乎顺风顺水。
       </p>
       <p>
        但他们有一个严重的问题——
        <strong>
         色情问题
        </strong>
        。
       </p>
       <p>
        该约会网站的用户中会有一些人上传色情图片，然后设置为其个人头像。这种行为破坏了很多其他用户的体验——导致很多用户取消了会员。
       </p>
       <p>
        可能对于现在的一些约会网站随处可见几张色情图片也许并不能称之为是问题。或者可以说是习以为常甚至有些期待，只是一个被接受然后被无视的在线约会的副产品。
       </p>
       <p>
        然而，这样的行为既不应该被接受也应该被忽视。
       </p>
       <p>
        别忘了，这次创业可是将自己定位在优秀的约会天堂，免于用户受到困扰其他约会网站的污秽和垃圾的烦扰。简而言之，他们拥有很实在的
        <strong>
         以风险资本作为背后支撑的名声
        </strong>
        ，而这也正是他们需要保持的风格。
       </p>
       <p>
        该约会网站为了能迅速阻止色情图片的爆发可以说是不顾一切了。他们雇佣了图片论坛版主团队，真是不做其他事只是每天盯着监管页面8个小时以上，然后移除任何被上传到社交网络的色情图片。
       </p>
       <p>
        毫不夸张的说，他们投入了数万美元（更不用说数不清的人工小时）来解决这个问题，然而也仅仅只是缓解，控制情况不变严重而不是在源头上阻止。
       </p>
       <p>
        色情图片的爆发在2009年的七月达到了临界水平。8个月来第一次用户量没能翻倍（甚至已经开始减少了）。更糟糕的是，投资者声称若该公司不能解决这个问题将会撤资。事实上，污秽的潮汐早已开始冲击这座象牙塔了，将它推翻流入大海也不过是时间问题。
       </p>
       <p>
        正在这个约会网站巨头快要撑不住时，我提出了一个更鲁棒的长期解决方案：
        <strong>
         如果我们使用图片指纹来与色情图片的爆发斗争呢？
        </strong>
       </p>
       <p>
        你看，每张图片都有一个指纹。正如人的指纹可以识别人，图片的指纹能识别图片。
       </p>
       <p>
        这促使了一个三阶段算法的实现：
       </p>
       <p>
        1. 为不雅图片建立指纹，然后将图片指纹存储在一个数据库中。
       </p>
       <p>
        2. 当一个用户上传一份新的头像时，我们会将它与数据库中的图片指纹对比。如果上传图片的指纹与数据库任意一个不雅图片指纹相符，我们就阻止用户将该图片设置为个人头像。
       </p>
       <p>
        3. 当图片监管人标记新的色情图片时，这些图片也被赋予指纹并存入我们的数据库，建立一个能用于阻止非法上传且不断进化的数据库。
       </p>
       <p>
        我们的方法，尽管不十分完美，但是也卓有成效。慢慢地，色情图片爆发的情况有所减慢。它永远不会消失——但这个算法让我们成功将非法上传的数量减少了
        <strong>
         80%
        </strong>
        以上。
       </p>
       <p>
        这也挽回了投资者的心。他们继续为我们提供资金支持——直到萧条到来，我们都失业了。
       </p>
       <p>
        回顾过去时，我不禁笑了。我的工作并没持续太久。这个公司也没有坚持太久。甚至还有几个投资者卷铺盖走人了。
       </p>
       <p>
        但有一样确实存活了下来。提取图片指纹的算法。几年之后，我把这个算法的基本内容分享出来，期望你们可以将它应用到你们自己的项目中。
       </p>
       <p>
        但最大的问题是，我们怎么才能建立图片指纹呢？
       </p>
       <p>
        继续读下去一探究竟吧。
        <strong>
        </strong>
       </p>
       <h3>
        即将要做的事情
       </h3>
       <p>
        我们打算用图片指纹进行相似图片的检测。这种技术通常被称为“感知图像hash”或是简单的“图片hash”。
        <strong>
        </strong>
       </p>
       <h3>
        什么是图片指纹/图片哈希
       </h3>
       <p>
       </p>
       <p>
        图片hash是检测一张图片的内容然后根据检测的内容为图片建立一个唯一值的过程。
       </p>
       <p>
        比如，看看本文最上面的那张图片。给定一张图片作为输入，应用一个hash函数，然后基于图片的视觉计算出一个图片hash。相似的图片也应当有相似的hash值。图片hash算法的应用使得相似图片的检测变得相当简单了。
       </p>
       <p>
        特别地，我们将会使用“差别Hash”或简单的DHash算法计算图片指纹。简单来说，DHash算法着眼于两个相邻像素之间的差值。然后，基于这样的差值，就建立起一个hash值了。
        <strong>
        </strong>
       </p>
       <h3>
        为什么不使用md5,sha-1等算法？
       </h3>
       <p>
        不幸的是，我们不能在实现中使用加密hash算法。由于加密hash算法的本质使然，输入文件中非常微小的差别也能造成差异极大的hash值。而在图片指纹的案例中，我们实际上希望相似的输入可以有相似的hash输出值。
        <strong>
        </strong>
       </p>
       <h3>
        图片指纹可以用在哪里？
       </h3>
       <p>
        正如我上面举的例子，你可以使用图片指纹来维护一个保存不雅图片的数据库——当用户尝试上传类似图片时可以发出警告。
       </p>
       <p>
        你可以建立一个图片的逆向搜索引擎，比如TinEye，它可以记录图片以及它们出现的相关网页。
       </p>
       <p>
        你还可以使用图片指纹帮助管理你个人的照片收集。假设你有一个硬盘，上面有你照片库的一些局部备份，但需要一个方法删除局部备份，一张图片仅保留一份唯一的备份——图片指纹可以帮你做到。
       </p>
       <p>
        简单来说，你几乎可以将图片指纹/哈希用于任何需要你检测图片的相似副本的场景中。
        <strong>
        </strong>
       </p>
       <h3>
        需要的库有哪些？
       </h3>
       <p>
        为了建立图片指纹方案，我们打算使用三个主要的Python包：
       </p>
       <p>
        •
        <a href="https://pillow.readthedocs.org/">
         PIL/Pillow
        </a>
        用于读取和载入图片
        <br/>
        •
        <a href="https://pypi.python.org/pypi/ImageHash">
         ImageHash
        </a>
        ，包括DHash的实现
        <br/>
        • 以及
        <a href="http://www.numpy.org/">
         NumPy
        </a>
        /
        <a href="http://www.scipy.org/">
         SciPy
        </a>
        ，ImageHash的依赖包
       </p>
       <p>
        你可以使用下列命令一键安装所需要的必备库：
       </p>
       <div>
        <div class="syntaxhighlighter notranslate text" id="highlighter_225093">
         <table border="0" cellpadding="0" cellspacing="0">
          <tbody>
           <tr>
            <td class="gutter">
             <div class="line number1 index0 alt2">
              1
             </div>
            </td>
            <td class="code">
             <div class="container">
              <div class="line number1 index0 alt2">
               <code class="text plain">
                $ pip install pillow imagehash
               </code>
              </div>
             </div>
            </td>
           </tr>
          </tbody>
         </table>
        </div>
       </div>
       <p>
        <strong>
         第一步：为一个图片集建立指纹
        </strong>
       </p>
       <p>
        第一步就是为我们的图片集建立指纹。
       </p>
       <p>
        也许你会问，但我们不会，我们不会使用那些我为那家约会网站工作时的色情图片。相反，我创建了一个可供使用的人工数据集。
       </p>
       <p>
        对计算机视觉的研究人员而言，数据集
        <a href="http://www.vision.caltech.edu/Image_Datasets/Caltech101/">
         CALTECH-101
        </a>
        是一个传奇般的存在。它包含来自101个不同分类中的至少7500张图片，内容分别有人物，摩托车和飞机。
       </p>
       <p>
        从这7500多张图片中，我随机的挑选了17张。
       </p>
       <p>
        然后，从这17张随机挑选的图片中，以几个百分点的比例随机放大/缩小并创建N张新图片。这里我们的目标是找到这些近似副本的图片——有点大海捞针的感觉。
       </p>
       <p>
        你也想创建一个类似的数据集用于工作吗？那就下载
        <a href="http://www.vision.caltech.edu/Image_Datasets/Caltech101/">
         CALTECH-101
        </a>
        数据集，抽取大概17张图片即可，然后运行repo下的脚本文件gather.py。
       </p>
       <p>
        回归正题，这些图片除了宽度和高度，其他各方面都是一样的。而且因为他们没有相同的形状，我们不能依赖简单的md5校验和。最重要的是，有相似内容的图片可能有完全不相同的md5哈希。然而，采取图片哈希，相似内容的图片也有相似的哈希指纹。
       </p>
       <p>
        所以赶紧开始写代码为数据集建立指纹吧。创建一个新文件，命名为index.py，然后开始工作：
       </p>
       <div>
        <div class="syntaxhighlighter notranslate python" id="highlighter_805115">
         <table border="0" cellpadding="0" cellspacing="0">
          <tbody>
           <tr>
            <td class="gutter">
             <div class="line number1 index0 alt2">
              1
             </div>
             <div class="line number2 index1 alt1">
              2
             </div>
             <div class="line number3 index2 alt2">
              3
             </div>
             <div class="line number4 index3 alt1">
              4
             </div>
             <div class="line number5 index4 alt2">
              5
             </div>
             <div class="line number6 index5 alt1">
              6
             </div>
             <div class="line number7 index6 alt2">
              7
             </div>
             <div class="line number8 index7 alt1">
              8
             </div>
             <div class="line number9 index8 alt2">
              9
             </div>
             <div class="line number10 index9 alt1">
              10
             </div>
             <div class="line number11 index10 alt2">
              11
             </div>
             <div class="line number12 index11 alt1">
              12
             </div>
             <div class="line number13 index12 alt2">
              13
             </div>
             <div class="line number14 index13 alt1">
              14
             </div>
             <div class="line number15 index14 alt2">
              15
             </div>
             <div class="line number16 index15 alt1">
              16
             </div>
             <div class="line number17 index16 alt2">
              17
             </div>
            </td>
            <td class="code">
             <div class="container">
              <div class="line number1 index0 alt2">
               <code class="python comments">
                # import the necessary packages
               </code>
              </div>
              <div class="line number2 index1 alt1">
               <code class="python keyword">
                from
               </code>
               <code class="python plain">
                PIL
               </code>
               <code class="python keyword">
                import
               </code>
               <code class="python plain">
                Image
               </code>
              </div>
              <div class="line number3 index2 alt2">
               <code class="python keyword">
                import
               </code>
               <code class="python plain">
                imagehash
               </code>
              </div>
              <div class="line number4 index3 alt1">
               <code class="python keyword">
                import
               </code>
               <code class="python plain">
                argparse
               </code>
              </div>
              <div class="line number5 index4 alt2">
               <code class="python keyword">
                import
               </code>
               <code class="python plain">
                shelve
               </code>
              </div>
              <div class="line number6 index5 alt1">
               <code class="python keyword">
                import
               </code>
               <code class="python plain">
                glob
               </code>
              </div>
              <div class="line number7 index6 alt2">
              </div>
              <div class="line number8 index7 alt1">
               <code class="python comments">
                # construct the argument parse and parse the arguments
               </code>
              </div>
              <div class="line number9 index8 alt2">
               <code class="python plain">
                ap
               </code>
               <code class="python keyword">
                =
               </code>
               <code class="python plain">
                argparse.ArgumentParser()
               </code>
              </div>
              <div class="line number10 index9 alt1">
               <code class="python plain">
                ap.add_argument(
               </code>
               <code class="python string">
                "-d"
               </code>
               <code class="python plain">
                ,
               </code>
               <code class="python string">
                "--dataset"
               </code>
               <code class="python plain">
                , required
               </code>
               <code class="python keyword">
                =
               </code>
               <code class="python color1">
                True
               </code>
               <code class="python plain">
                ,
               </code>
              </div>
              <div class="line number11 index10 alt2">
               <code class="python functions">
                help
               </code>
               <code class="python keyword">
                =
               </code>
               <code class="python string">
                "path to input dataset of images"
               </code>
               <code class="python plain">
                )
               </code>
              </div>
              <div class="line number12 index11 alt1">
               <code class="python plain">
                ap.add_argument(
               </code>
               <code class="python string">
                "-s"
               </code>
               <code class="python plain">
                ,
               </code>
               <code class="python string">
                "--shelve"
               </code>
               <code class="python plain">
                , required
               </code>
               <code class="python keyword">
                =
               </code>
               <code class="python color1">
                True
               </code>
               <code class="python plain">
                ,
               </code>
              </div>
              <div class="line number13 index12 alt2">
               <code class="python functions">
                help
               </code>
               <code class="python keyword">
                =
               </code>
               <code class="python string">
                "output shelve database"
               </code>
               <code class="python plain">
                )
               </code>
              </div>
              <div class="line number14 index13 alt1">
               <code class="python plain">
                args
               </code>
               <code class="python keyword">
                =
               </code>
               <code class="python functions">
                vars
               </code>
               <code class="python plain">
                (ap.parse_args())
               </code>
              </div>
              <div class="line number15 index14 alt2">
              </div>
              <div class="line number16 index15 alt1">
               <code class="python comments">
                # open the shelve database
               </code>
              </div>
              <div class="line number17 index16 alt2">
               <code class="python plain">
                db
               </code>
               <code class="python keyword">
                =
               </code>
               <code class="python plain">
                shelve.
               </code>
               <code class="python functions">
                open
               </code>
               <code class="python plain">
                (args[
               </code>
               <code class="python string">
                "shelve"
               </code>
               <code class="python plain">
                ], writeback
               </code>
               <code class="python keyword">
                =
               </code>
               <code class="python color1">
                True
               </code>
               <code class="python plain">
                )
               </code>
              </div>
             </div>
            </td>
           </tr>
          </tbody>
         </table>
        </div>
       </div>
       <p>
        要做的第一件事就是引入我们需要的包。我们将使用PIL或Pillow中的Image类载入硬盘上的图片。这个imagehash库可以被用于构建哈希算法。
       </p>
       <p>
        Argparse库用于解析命令行参数，shelve库用作一个存储在硬盘上的简单键值对数据库（Python字典）。glob库能很容易的获取图片路径。
       </p>
       <p>
        然后传递命令行参数。第一个，—dataset是输入图片库的路径。第二个，—shelve是shelve数据库的输出路径。
       </p>
       <p>
        下一步，打开shelve数据库以写数据。这个db数据库存储图片哈希。更多的如下所示：
       </p>
       <div>
        <div class="syntaxhighlighter notranslate python" id="highlighter_477461">
         <table border="0" cellpadding="0" cellspacing="0">
          <tbody>
           <tr>
            <td class="gutter">
             <div class="line number1 index0 alt2">
              1
             </div>
             <div class="line number2 index1 alt1">
              2
             </div>
             <div class="line number3 index2 alt2">
              3
             </div>
             <div class="line number4 index3 alt1">
              4
             </div>
             <div class="line number5 index4 alt2">
              5
             </div>
             <div class="line number6 index5 alt1">
              6
             </div>
             <div class="line number7 index6 alt2">
              7
             </div>
             <div class="line number8 index7 alt1">
              8
             </div>
             <div class="line number9 index8 alt2">
              9
             </div>
             <div class="line number10 index9 alt1">
              10
             </div>
             <div class="line number11 index10 alt2">
              11
             </div>
             <div class="line number12 index11 alt1">
              12
             </div>
             <div class="line number13 index12 alt2">
              13
             </div>
             <div class="line number14 index13 alt1">
              14
             </div>
            </td>
            <td class="code">
             <div class="container">
              <div class="line number1 index0 alt2">
               <code class="python comments">
                # loop over the image dataset
               </code>
              </div>
              <div class="line number2 index1 alt1">
               <code class="python keyword">
                for
               </code>
               <code class="python plain">
                imagePath
               </code>
               <code class="python keyword">
                in
               </code>
               <code class="python plain">
                glob.glob(args[
               </code>
               <code class="python string">
                "dataset"
               </code>
               <code class="python plain">
                ]
               </code>
               <code class="python keyword">
                +
               </code>
               <code class="python string">
                "/*.jpg"
               </code>
               <code class="python plain">
                ):
               </code>
              </div>
              <div class="line number3 index2 alt2">
               <code class="python spaces">
               </code>
               <code class="python comments">
                # load the image and compute the difference hash
               </code>
              </div>
              <div class="line number4 index3 alt1">
               <code class="python spaces">
               </code>
               <code class="python plain">
                image
               </code>
               <code class="python keyword">
                =
               </code>
               <code class="python plain">
                Image.
               </code>
               <code class="python functions">
                open
               </code>
               <code class="python plain">
                (imagePath)
               </code>
              </div>
              <div class="line number5 index4 alt2">
               <code class="python spaces">
               </code>
               <code class="python plain">
                h
               </code>
               <code class="python keyword">
                =
               </code>
               <code class="python functions">
                str
               </code>
               <code class="python plain">
                (imagehash.dhash(image))
               </code>
              </div>
              <div class="line number6 index5 alt1">
              </div>
              <div class="line number7 index6 alt2">
               <code class="python spaces">
               </code>
               <code class="python comments">
                # extract the filename from the path and update the database
               </code>
              </div>
              <div class="line number8 index7 alt1">
               <code class="python spaces">
               </code>
               <code class="python comments">
                # using the hash as the key and the filename append to the
               </code>
              </div>
              <div class="line number9 index8 alt2">
               <code class="python spaces">
               </code>
               <code class="python comments">
                # list of values
               </code>
              </div>
              <div class="line number10 index9 alt1">
               <code class="python spaces">
               </code>
               <code class="python plain">
                filename
               </code>
               <code class="python keyword">
                =
               </code>
               <code class="python plain">
                imagePath[imagePath.rfind(
               </code>
               <code class="python string">
                "/"
               </code>
               <code class="python plain">
                )
               </code>
               <code class="python keyword">
                +
               </code>
               <code class="python value">
                1
               </code>
               <code class="python plain">
                :]
               </code>
              </div>
              <div class="line number11 index10 alt2">
               <code class="python spaces">
               </code>
               <code class="python plain">
                db[h]
               </code>
               <code class="python keyword">
                =
               </code>
               <code class="python plain">
                db.get(h, [])
               </code>
               <code class="python keyword">
                +
               </code>
               <code class="python plain">
                [filename]
               </code>
              </div>
              <div class="line number12 index11 alt1">
              </div>
              <div class="line number13 index12 alt2">
               <code class="python comments">
                # close the shelf database
               </code>
              </div>
              <div class="line number14 index13 alt1">
               <code class="python plain">
                db.close()
               </code>
              </div>
             </div>
            </td>
           </tr>
          </tbody>
         </table>
        </div>
       </div>
       <p>
        以上就是大部分工作的内容了。开始循环从硬盘读取图片，创建图片指纹并存入数据库。
       </p>
       <p>
        现在，来看看整个范例中最重要的两行代码：
       </p>
       <div>
        <div class="syntaxhighlighter notranslate python" id="highlighter_233430">
         <table border="0" cellpadding="0" cellspacing="0">
          <tbody>
           <tr>
            <td class="gutter">
             <div class="line number1 index0 alt2">
              1
             </div>
             <div class="line number2 index1 alt1">
              2
             </div>
            </td>
            <td class="code">
             <div class="container">
              <div class="line number1 index0 alt2">
               <code class="python plain">
                filename
               </code>
               <code class="python keyword">
                =
               </code>
               <code class="python plain">
                imagePath[imagePath.rfind(
               </code>
               <code class="python string">
                "/"
               </code>
               <code class="python plain">
                )
               </code>
               <code class="python keyword">
                +
               </code>
               <code class="python value">
                1
               </code>
               <code class="python plain">
                :]
               </code>
              </div>
              <div class="line number2 index1 alt1">
               <code class="python plain">
                db[h]
               </code>
               <code class="python keyword">
                =
               </code>
               <code class="python plain">
                db.get(h, [])
               </code>
               <code class="python keyword">
                +
               </code>
               <code class="python plain">
                [filename]
               </code>
              </div>
             </div>
            </td>
           </tr>
          </tbody>
         </table>
        </div>
       </div>
       <p>
        正如本文早些时候提到的，有相同指纹的图片被认为是一样的。
       </p>
       <p>
        因此，如果我们的目标是找到近似图片，那就需要维护一个有相同指纹值的图片列表。
       </p>
       <p>
        而这也正是这几行代码做的事情。
       </p>
       <p>
        前一个代码段提取了图片的文件名。而后一个代码片段维护了一个有相同指纹值的图片列表。
       </p>
       <p>
        为了从我们的数据库中提取图片指纹并建立哈希数据库，运行下列命令：
       </p>
       <div>
        <div class="syntaxhighlighter notranslate text" id="highlighter_92477">
         <table border="0" cellpadding="0" cellspacing="0">
          <tbody>
           <tr>
            <td class="gutter">
             <div class="line number1 index0 alt2">
              1
             </div>
            </td>
            <td class="code">
             <div class="container">
              <div class="line number1 index0 alt2">
               <code class="text plain">
                $ python index.py —dataset images —shelve db.shelve
               </code>
              </div>
             </div>
            </td>
           </tr>
          </tbody>
         </table>
        </div>
       </div>
       <p>
        这个脚本会运行几秒钟，完成后，就会出现一个名为db.shelve的文件，包含了图片指纹和文件名的键值对。
       </p>
       <p>
        这个基本算法正是几年前我为这家约会创业公司工作时使用的算法。我们获得了一个不雅图片集，为其中的每张图片构建一个图片指纹并将其存入数据库。当来一张新图片时，我只需简单地计算它的哈希值，检测数据库查看是否上传图片已被标识为非法内容。
       </p>
       <p>
        下一步中，我将展示实际如何执行查询，判定数据库中是否存在与所给图片具有相同哈希值的图片。
        <strong>
        </strong>
       </p>
       <h3>
        第二步：查询数据集
       </h3>
       <p>
       </p>
       <p>
        既然已经建立了一个图片指纹的数据库，那么现在就该搜索我们的数据集了。
       </p>
       <p>
        打开一个新文件，命名为search.py，然后开始写代码：
       </p>
       <div>
        <div class="syntaxhighlighter notranslate python" id="highlighter_877081">
         <table border="0" cellpadding="0" cellspacing="0">
          <tbody>
           <tr>
            <td class="gutter">
             <div class="line number1 index0 alt2">
              1
             </div>
             <div class="line number2 index1 alt1">
              2
             </div>
             <div class="line number3 index2 alt2">
              3
             </div>
             <div class="line number4 index3 alt1">
              4
             </div>
             <div class="line number5 index4 alt2">
              5
             </div>
             <div class="line number6 index5 alt1">
              6
             </div>
             <div class="line number7 index6 alt2">
              7
             </div>
             <div class="line number8 index7 alt1">
              8
             </div>
             <div class="line number9 index8 alt2">
              9
             </div>
             <div class="line number10 index9 alt1">
              10
             </div>
             <div class="line number11 index10 alt2">
              11
             </div>
             <div class="line number12 index11 alt1">
              12
             </div>
             <div class="line number13 index12 alt2">
              13
             </div>
             <div class="line number14 index13 alt1">
              14
             </div>
             <div class="line number15 index14 alt2">
              15
             </div>
            </td>
            <td class="code">
             <div class="container">
              <div class="line number1 index0 alt2">
               <code class="python comments">
                # import the necessary packages
               </code>
              </div>
              <div class="line number2 index1 alt1">
               <code class="python keyword">
                from
               </code>
               <code class="python plain">
                PIL
               </code>
               <code class="python keyword">
                import
               </code>
               <code class="python plain">
                Image
               </code>
              </div>
              <div class="line number3 index2 alt2">
               <code class="python keyword">
                import
               </code>
               <code class="python plain">
                imagehash
               </code>
              </div>
              <div class="line number4 index3 alt1">
               <code class="python keyword">
                import
               </code>
               <code class="python plain">
                argparse
               </code>
              </div>
              <div class="line number5 index4 alt2">
               <code class="python keyword">
                import
               </code>
               <code class="python plain">
                shelve
               </code>
              </div>
              <div class="line number6 index5 alt1">
              </div>
              <div class="line number7 index6 alt2">
               <code class="python comments">
                # construct the argument parse and parse the arguments
               </code>
              </div>
              <div class="line number8 index7 alt1">
               <code class="python plain">
                ap
               </code>
               <code class="python keyword">
                =
               </code>
               <code class="python plain">
                argparse.ArgumentParser()
               </code>
              </div>
              <div class="line number9 index8 alt2">
               <code class="python plain">
                ap.add_argument(
               </code>
               <code class="python string">
                "-d"
               </code>
               <code class="python plain">
                ,
               </code>
               <code class="python string">
                "--dataset"
               </code>
               <code class="python plain">
                , required
               </code>
               <code class="python keyword">
                =
               </code>
               <code class="python color1">
                True
               </code>
               <code class="python plain">
                ,
               </code>
              </div>
              <div class="line number10 index9 alt1">
               <code class="python spaces">
               </code>
               <code class="python functions">
                help
               </code>
               <code class="python keyword">
                =
               </code>
               <code class="python string">
                "path to dataset of images"
               </code>
               <code class="python plain">
                )
               </code>
              </div>
              <div class="line number11 index10 alt2">
               <code class="python plain">
                ap.add_argument(
               </code>
               <code class="python string">
                "-s"
               </code>
               <code class="python plain">
                ,
               </code>
               <code class="python string">
                "--shelve"
               </code>
               <code class="python plain">
                , required
               </code>
               <code class="python keyword">
                =
               </code>
               <code class="python color1">
                True
               </code>
               <code class="python plain">
                ,
               </code>
              </div>
              <div class="line number12 index11 alt1">
               <code class="python spaces">
               </code>
               <code class="python functions">
                help
               </code>
               <code class="python keyword">
                =
               </code>
               <code class="python string">
                "output shelve database"
               </code>
               <code class="python plain">
                )
               </code>
              </div>
              <div class="line number13 index12 alt2">
               <code class="python plain">
                ap.add_argument(
               </code>
               <code class="python string">
                "-q"
               </code>
               <code class="python plain">
                ,
               </code>
               <code class="python string">
                "--query"
               </code>
               <code class="python plain">
                , required
               </code>
               <code class="python keyword">
                =
               </code>
               <code class="python color1">
                True
               </code>
               <code class="python plain">
                ,
               </code>
              </div>
              <div class="line number14 index13 alt1">
               <code class="python spaces">
               </code>
               <code class="python functions">
                help
               </code>
               <code class="python keyword">
                =
               </code>
               <code class="python string">
                "path to the query image"
               </code>
               <code class="python plain">
                )
               </code>
              </div>
              <div class="line number15 index14 alt2">
               <code class="python plain">
                args
               </code>
               <code class="python keyword">
                =
               </code>
               <code class="python functions">
                vars
               </code>
               <code class="python plain">
                (ap.parse_args())
               </code>
              </div>
             </div>
            </td>
           </tr>
          </tbody>
         </table>
        </div>
       </div>
       <p>
        我们需要再一次导入相关的包。然后转换命令行参数。需要三个选项，—dataset初始图片集的路径，—shelve，保存键值对的数据库的路径，—query，查询/上传图片的路径。我们的目标是对于每个查询图片，判定数据库中是否已经存在。
       </p>
       <p>
        现在，写代码执行实际的查询：
       </p>
       <div>
        <div class="syntaxhighlighter notranslate python" id="highlighter_373806">
         <table border="0" cellpadding="0" cellspacing="0">
          <tbody>
           <tr>
            <td class="gutter">
             <div class="line number1 index0 alt2">
              1
             </div>
             <div class="line number2 index1 alt1">
              2
             </div>
             <div class="line number3 index2 alt2">
              3
             </div>
             <div class="line number4 index3 alt1">
              4
             </div>
             <div class="line number5 index4 alt2">
              5
             </div>
             <div class="line number6 index5 alt1">
              6
             </div>
             <div class="line number7 index6 alt2">
              7
             </div>
             <div class="line number8 index7 alt1">
              8
             </div>
             <div class="line number9 index8 alt2">
              9
             </div>
             <div class="line number10 index9 alt1">
              10
             </div>
             <div class="line number11 index10 alt2">
              11
             </div>
             <div class="line number12 index11 alt1">
              12
             </div>
             <div class="line number13 index12 alt2">
              13
             </div>
             <div class="line number14 index13 alt1">
              14
             </div>
             <div class="line number15 index14 alt2">
              15
             </div>
             <div class="line number16 index15 alt1">
              16
             </div>
             <div class="line number17 index16 alt2">
              17
             </div>
             <div class="line number18 index17 alt1">
              18
             </div>
            </td>
            <td class="code">
             <div class="container">
              <div class="line number1 index0 alt2">
               <code class="python comments">
                # open the shelve database
               </code>
              </div>
              <div class="line number2 index1 alt1">
               <code class="python plain">
                db
               </code>
               <code class="python keyword">
                =
               </code>
               <code class="python plain">
                shelve.
               </code>
               <code class="python functions">
                open
               </code>
               <code class="python plain">
                (args[
               </code>
               <code class="python string">
                "shelve"
               </code>
               <code class="python plain">
                ])
               </code>
              </div>
              <div class="line number3 index2 alt2">
              </div>
              <div class="line number4 index3 alt1">
               <code class="python comments">
                # load the query image, compute the difference image hash, and
               </code>
              </div>
              <div class="line number5 index4 alt2">
               <code class="python comments">
                # and grab the images from the database that have the same hash
               </code>
              </div>
              <div class="line number6 index5 alt1">
               <code class="python comments">
                # value
               </code>
              </div>
              <div class="line number7 index6 alt2">
               <code class="python plain">
                query
               </code>
               <code class="python keyword">
                =
               </code>
               <code class="python plain">
                Image.
               </code>
               <code class="python functions">
                open
               </code>
               <code class="python plain">
                (args[
               </code>
               <code class="python string">
                "query"
               </code>
               <code class="python plain">
                ])
               </code>
              </div>
              <div class="line number8 index7 alt1">
               <code class="python plain">
                h
               </code>
               <code class="python keyword">
                =
               </code>
               <code class="python functions">
                str
               </code>
               <code class="python plain">
                (imagehash.dhash(query))
               </code>
              </div>
              <div class="line number9 index8 alt2">
               <code class="python plain">
                filenames
               </code>
               <code class="python keyword">
                =
               </code>
               <code class="python plain">
                db[h]
               </code>
              </div>
              <div class="line number10 index9 alt1">
               <code class="python keyword">
                print
               </code>
               <code class="python string">
                "Found %d images"
               </code>
               <code class="python keyword">
                %
               </code>
               <code class="python plain">
                (
               </code>
               <code class="python functions">
                len
               </code>
               <code class="python plain">
                (filenames))
               </code>
              </div>
              <div class="line number11 index10 alt2">
              </div>
              <div class="line number12 index11 alt1">
               <code class="python comments">
                # loop over the images
               </code>
              </div>
              <div class="line number13 index12 alt2">
               <code class="python keyword">
                for
               </code>
               <code class="python plain">
                filename
               </code>
               <code class="python keyword">
                in
               </code>
               <code class="python plain">
                filenames:
               </code>
              </div>
              <div class="line number14 index13 alt1">
               <code class="python spaces">
               </code>
               <code class="python plain">
                image
               </code>
               <code class="python keyword">
                =
               </code>
               <code class="python plain">
                Image.
               </code>
               <code class="python functions">
                open
               </code>
               <code class="python plain">
                (args[
               </code>
               <code class="python string">
                "dataset"
               </code>
               <code class="python plain">
                ]
               </code>
               <code class="python keyword">
                +
               </code>
               <code class="python string">
                "/"
               </code>
               <code class="python keyword">
                +
               </code>
               <code class="python plain">
                filename)
               </code>
              </div>
              <div class="line number15 index14 alt2">
               <code class="python spaces">
               </code>
               <code class="python plain">
                image.show()
               </code>
              </div>
              <div class="line number16 index15 alt1">
              </div>
              <div class="line number17 index16 alt2">
               <code class="python comments">
                # close the shelve database
               </code>
              </div>
              <div class="line number18 index17 alt1">
               <code class="python plain">
                db.close()
               </code>
              </div>
             </div>
            </td>
           </tr>
          </tbody>
         </table>
        </div>
       </div>
       <p>
        首先打开数据库，然后载入硬盘上的图片，计算图片的指纹，找到具有相同指纹的所有图片。
       </p>
       <p>
        如果有图片具有相同的哈希值，会遍历这些图片并展示在屏幕上。
       </p>
       <p>
        这段代码使我们仅仅使用指纹值就能判定图片是否已在数据库中存在。
        <strong>
        </strong>
       </p>
       <h3>
        结果
       </h3>
       <p>
        正如本文早些时候提到的，我从CALTECH-101数据集的7500多张图片中随机选取17张，然后通过任意缩放一部分点产生N张新的图片。
       </p>
       <p>
        这些图片在尺寸上仅仅是少数像素不同—但也是因为这一点我们不能依赖于文件的md5哈希（这一点已在“优化算法”部分进行了详尽的描述）。然而，我们可以使用图片哈希找到近似图片。
       </p>
       <p>
        打开你的终端并执行下述命令：
       </p>
       <div>
        <div class="syntaxhighlighter notranslate text" id="highlighter_645437">
         <table border="0" cellpadding="0" cellspacing="0">
          <tbody>
           <tr>
            <td class="gutter">
             <div class="line number1 index0 alt2">
              1
             </div>
            </td>
            <td class="code">
             <div class="container">
              <div class="line number1 index0 alt2">
               <code class="text plain">
                $ python search.py —dataset images —shelve db.shelve —query images/84eba74d-38ae-4bf6-b8bd-79ffa1dad23a.jpg
               </code>
              </div>
             </div>
            </td>
           </tr>
          </tbody>
         </table>
        </div>
       </div>
       <p>
        如果一切顺利你就可以看到下述结果：
       </p>
       <p>
        <img src="http://dataunion.org/wp-content/uploads/2015/04/6941baebgw1er4asukjh2j212w0obn30.jpg"/>
       </p>
       <p>
        左边是输入图片。载入这张图片，计算它的图片指纹，在数据库中搜索指纹查看是否存在有相同指纹的图片。
       </p>
       <p>
        当然——正如右边所示，我们的数据集中有其他两张指纹相同的图片。尽管从截图中还不能十分明显的看出，这些图片，虽然有完全相同的视觉内容，也不是完全相同！这三张图片的高度宽度各不相同。
       </p>
       <p>
        尝试一下另外一个输入图片：
       </p>
       <div>
        <div class="syntaxhighlighter notranslate text" id="highlighter_807647">
         <table border="0" cellpadding="0" cellspacing="0">
          <tbody>
           <tr>
            <td class="gutter">
             <div class="line number1 index0 alt2">
              1
             </div>
            </td>
            <td class="code">
             <div class="container">
              <div class="line number1 index0 alt2">
               <code class="text plain">
                $ python search.py —dataset images —shelve db.shelve —query images/9d355a22-3d59-465e-ad14-138a4e3880bc.jpg
               </code>
              </div>
             </div>
            </td>
           </tr>
          </tbody>
         </table>
        </div>
       </div>
       <p>
        下面是结果：
       </p>
       <p>
        <img src="http://dataunion.org/wp-content/uploads/2015/04/6941baebgw1er4asvd08fj212w0obwly.jpg"/>
       </p>
       <p>
        左边仍然是我们的输入图片。正如右边展示的，我们的图片指纹算法能够找出具有相同指纹的三张完全相同的图片。
       </p>
       <p>
        最后一个例子：
       </p>
       <div>
        <div class="syntaxhighlighter notranslate text" id="highlighter_321795">
         <table border="0" cellpadding="0" cellspacing="0">
          <tbody>
           <tr>
            <td class="gutter">
             <div class="line number1 index0 alt2">
              1
             </div>
            </td>
            <td class="code">
             <div class="container">
              <div class="line number1 index0 alt2">
               <code class="text plain">
                $ python search.py —dataset images —shelve db.shelve —query images/5134e0c2-34d3-40b6-9473-98de8be16c67.jpg
               </code>
              </div>
             </div>
            </td>
           </tr>
          </tbody>
         </table>
        </div>
       </div>
       <p>
        <img src="http://dataunion.org/wp-content/uploads/2015/04/6941baebgw1er4aswazf5j212w0objxl.jpg"/>
       </p>
       <p>
        这一次左边的输入图片是一个摩托车。拿到这张摩托车图片，计算它的图片指纹，然后在指纹数据库中查找该指纹。正如我们在右边看到的，我们也能判断出数据库中有三张图片具有相同指纹。
        <strong>
        </strong>
       </p>
       <h3>
        优化算法
       </h3>
       <p>
        有很多可以优化本算法的方法——但最关键性的是要考虑到相似但不相同的哈希。
       </p>
       <p>
        比如，本文中的图片仅仅是一小部分点重组了（依比例增大或减小）。如果一张图片以一个较大的因素调整大小，或者纵横比被改变了，对应的哈希就会不同了。
       </p>
       <p>
        然而，这些图片应该仍然是相似的。
       </p>
       <p>
        为了找到相似但不相同的图片，我们需要计算汉明距离（Hamming distance）.汉明距离被用于计算一个哈希中的不同位数。因此，哈希中只有一位不同的两张图片自然比有10位不同的图片更相似。
       </p>
       <p>
        然而，我们遇到了第二个问题——算法的可扩展性。
       </p>
       <p>
        考虑一下：我们有一张输入图片，又被要求在数据库中找到所有相似图片。然后我们必须计算输入图片和数据库中的每一张图片之间的汉明距离。
       </p>
       <p>
        随着数据库规模的增长，和数据库比对的时间也随着延长。最终，我们的哈希数据库会达到一个线性比对已经不实际的规模。
       </p>
       <p>
        解决办法，虽然已超出本文范围，就是利用
        <a href="http://en.wikipedia.org/wiki/K-d_tree">
         K-d trees
        </a>
        和
        <a href="http://en.wikipedia.org/wiki/Vantage-point_tree">
         VP trees
        </a>
        将搜索问题的复杂度从线性减小到次线性。
        <strong>
        </strong>
       </p>
       <h3>
        总结
       </h3>
       <p>
        本文中我们学会了如何构建和使用图片哈希来完成相似图片的检测。这些图片哈希是使用图片的视觉内容构建的。
       </p>
       <p>
        正如一个指纹可以识别一个人，图片哈希也能唯一的识别一张图片。
       </p>
       <p>
        使用图片指纹的知识，我们建立了一个仅使用图片哈希就能找到和识别具有相似内容的图片的系统。
       </p>
       <p>
        然后我们又演示了图片哈希是如何应用于快速找到有相似内容的图片。
       </p>
       <p>
        从
        <a href="https://github.com/realpython/image-fingerprinting">
         repo
        </a>
        目录下下载代码。
        <strong>
        </strong>
       </p>
       <p>
        翻译：
        <a href="http://python.jobbole.com/author/fzr/">
         fzr
        </a>
       </p>
       <p>
        英文出处：
        <a href="https://realpython.com/blog/python/fingerprinting-images-for-near-duplicate-detection/" target="_blank">
         realpython.com
        </a>
       </p>
       <p>
        文章出处：http://python.jobbole.com/81277/
       </p>
      </div>
      <div>
       <strong>
        注：转载文章均来自于公开网络，仅供学习使用，不会用于任何商业用途，如果侵犯到原作者的权益，请您与我们联系删除或者授权事宜，联系邮箱：contact@dataunion.org。转载数盟网站文章请注明原文章作者，否则产生的任何版权纠纷与数盟无关。
       </strong>
      </div>
      <!--content_text-->
      <div class="fenxian">
       <!-- JiaThis Button BEGIN -->
       <div class="jiathis_style_32x32">
        <p class="jiathis_button_weixin">
        </p>
        <p class="jiathis_button_tsina">
        </p>
        <p class="jiathis_button_qzone">
        </p>
        <p class="jiathis_button_cqq">
        </p>
        <p class="jiathis_button_tumblr">
        </p>
        <a class="jiathis jiathis_txt jtico jtico_jiathis" href="http://www.jiathis.com/share" target="_blank">
        </a>
        <p class="jiathis_counter_style">
        </p>
       </div>
       <!-- JiaThis Button END -->
      </div>
     </article>
     <!--content-->
     <!--相关文章-->
     <div class="xianguan">
      <div class="xianguantitle">
       相关文章！
      </div>
      <ul class="pic">
       <li>
        <a href="http://dataunion.org/20307.html">
         <img src="http://dataunion.org/wp-content/uploads/2015/08/t010b2fa5144a966273_副本.jpg"/>
        </a>
        <a class="link" href="http://dataunion.org/20307.html" rel="bookmark" title="图像识别四大图像库比较：OpenCV/FreeImage/CImg/CxImage">
         图像识别四大图像库比较：OpenCV/FreeImage/CImg/CxImage
        </a>
       </li>
       <li>
        <a href="http://dataunion.org/19942.html">
         <img src="http://dataunion.org/wp-content/uploads/2015/07/2015-07-07___10.36.55_副本.png"/>
        </a>
        <a class="link" href="http://dataunion.org/19942.html" rel="bookmark" title="成功“读懂”用户情绪之后，我们怎么挣钱？">
         成功“读懂”用户情绪之后，我们怎么挣钱？
        </a>
       </li>
       <li>
        <a href="http://dataunion.org/19903.html">
         <img src="http://dataunion.org/wp-content/uploads/2015/07/9UH5-fxesfuc3474202-300x270.png"/>
        </a>
        <a class="link" href="http://dataunion.org/19903.html" rel="bookmark" title="只看颜色不看脸？谷歌Photos捅篓子把黑人当成大猩猩">
         只看颜色不看脸？谷歌Photos捅篓子把黑人当成大猩猩
        </a>
       </li>
       <li>
        <a href="http://dataunion.org/19880.html">
         <img src="http://dataunion.org/wp-content/uploads/2015/07/t01528cba683562399e_副本.jpg"/>
        </a>
        <a class="link" href="http://dataunion.org/19880.html" rel="bookmark" title="从感知摄像机看图像识别技术的具体行业应用">
         从感知摄像机看图像识别技术的具体行业应用
        </a>
       </li>
      </ul>
     </div>
     <!--相关文章-->
     <div class="comment" id="comments">
      <!-- You can start editing here. -->
      <!-- If comments are open, but there are no comments. -->
      <div class="title">
       期待你一针见血的评论，Come on！
      </div>
      <div id="respond">
       <p>
        不用想啦，马上
        <a href="http://dataunion.org/wp-login.php?redirect_to=http%3A%2F%2Fdataunion.org%2F14960.html">
         "登录"
        </a>
        发表自已的想法.
       </p>
      </div>
     </div>
     <!-- .nav-single -->
    </div>
    <!--Container End-->
    <aside id="sitebar">
     <div class="sitebar_list2">
      <div class="wptag">
       <span class="tagtitle">
        热门标签+
       </span>
       <div class="tagg">
        <ul class="menu" id="menu-%e5%8f%8b%e6%83%85%e9%93%be%e6%8e%a5">
         <li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-1605" id="menu-item-1605">
          <a href="http://taidizh.com/">
           泰迪智慧
          </a>
         </li>
         <li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-20884" id="menu-item-20884">
          <a href="http://www.transwarp.cn/">
           星环科技
          </a>
         </li>
         <li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-3538" id="menu-item-3538">
          <a href="http://datall.org/">
           珈和遥感
          </a>
         </li>
         <li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-20888" id="menu-item-20888">
          <a href="http://www.chinahadoop.cn/">
           小象学院
          </a>
         </li>
        </ul>
       </div>
      </div>
     </div>
     <div class="sitebar_list">
      <div class="textwidget">
       <div align="center">
        <a href="http://study.163.com/course/courseMain.htm?courseId=991022" target="_blank">
         <img src="http://dataunion.org/wp-content/uploads/2016/03/dv.jpg"/>
        </a>
       </div>
      </div>
     </div>
     <div class="sitebar_list">
      <h4 class="sitebar_title">
       文章分类
      </h4>
      <div class="tagcloud">
       <a class="tag-link-44" href="http://dataunion.org/category/industry/demo" style="font-size: 10.204724409449pt;" title="4个话题">
        Demo展示
       </a>
       <a class="tag-link-31" href="http://dataunion.org/category/experts" style="font-size: 15.826771653543pt;" title="52个话题">
        专家团队
       </a>
       <a class="tag-link-870" href="http://dataunion.org/category/tech/ai" style="font-size: 19.795275590551pt;" title="273个话题">
        人工智能
       </a>
       <a class="tag-link-488" href="http://dataunion.org/category/%e5%8a%a0%e5%85%a5%e6%95%b0%e7%9b%9f" style="font-size: 8pt;" title="1个话题">
        加入数盟
       </a>
       <a class="tag-link-869" href="http://dataunion.org/category/tech/viz" style="font-size: 17.204724409449pt;" title="93个话题">
        可视化
       </a>
       <a class="tag-link-30" href="http://dataunion.org/category/partners" style="font-size: 10.645669291339pt;" title="5个话题">
        合作伙伴
       </a>
       <a class="tag-link-889" href="http://dataunion.org/category/parterc" style="font-size: 11.582677165354pt;" title="8个话题">
        合作会议
       </a>
       <a class="tag-link-104" href="http://dataunion.org/category/books" style="font-size: 12.96062992126pt;" title="15个话题">
        图书
       </a>
       <a class="tag-link-220" href="http://dataunion.org/category/tech/base" style="font-size: 19.850393700787pt;" title="281个话题">
        基础架构
       </a>
       <a class="tag-link-219" href="http://dataunion.org/category/tech/analysis" style="font-size: 19.409448818898pt;" title="232个话题">
        数据分析
       </a>
       <a class="tag-link-887" href="http://dataunion.org/category/tech/dm" style="font-size: 13.291338582677pt;" title="17个话题">
        数据挖掘
       </a>
       <a class="tag-link-34" href="http://dataunion.org/category/tech" style="font-size: 20.732283464567pt;" title="404个话题">
        文章
       </a>
       <a class="tag-link-1" href="http://dataunion.org/category/uncategorized" style="font-size: 22pt;" title="693个话题">
        未分类
       </a>
       <a class="tag-link-4" href="http://dataunion.org/category/events" style="font-size: 14.503937007874pt;" title="29个话题">
        活动
       </a>
       <a class="tag-link-890" href="http://dataunion.org/category/tech/%e6%b7%b1%e5%ba%a6%e5%ad%a6%e4%b9%a0" style="font-size: 10.204724409449pt;" title="4个话题">
        深度学习
       </a>
       <a class="tag-link-221" href="http://dataunion.org/category/tech/devl" style="font-size: 18.968503937008pt;" title="193个话题">
        编程语言
       </a>
       <a class="tag-link-888" href="http://dataunion.org/category/career" style="font-size: 15.661417322835pt;" title="48个话题">
        职业规划
       </a>
       <a class="tag-link-5" href="http://dataunion.org/category/jobs" style="font-size: 14.11811023622pt;" title="25个话题">
        职位
       </a>
       <a class="tag-link-871" href="http://dataunion.org/category/industry" style="font-size: 15.716535433071pt;" title="49个话题">
        行业
       </a>
       <a class="tag-link-613" href="http://dataunion.org/category/industry/case" style="font-size: 16.984251968504pt;" title="84个话题">
        行业应用
       </a>
       <a class="tag-link-885" href="http://dataunion.org/category/industry/news" style="font-size: 17.425196850394pt;" title="102个话题">
        行业资讯
       </a>
       <a class="tag-link-10" href="http://dataunion.org/category/training" style="font-size: 14.228346456693pt;" title="26个话题">
        课程
       </a>
       <a class="tag-link-16" href="http://dataunion.org/category/sources" style="font-size: 15.661417322835pt;" title="48个话题">
        资源
       </a>
      </div>
     </div>
     <div class="sitebar_list">
      <h4 class="sitebar_title">
       功能
      </h4>
      <ul>
       <li>
        <a href="http://dataunion.org/wp-login.php?action=register">
         注册
        </a>
       </li>
       <li>
        <a href="http://dataunion.org/wp-login.php">
         登录
        </a>
       </li>
       <li>
        <a href="http://dataunion.org/feed">
         文章
         <abbr title="Really Simple Syndication">
          RSS
         </abbr>
        </a>
       </li>
       <li>
        <a href="http://dataunion.org/comments/feed">
         评论
         <abbr title="Really Simple Syndication">
          RSS
         </abbr>
        </a>
       </li>
       <li>
        <a href="https://cn.wordpress.org/" title="基于WordPress，一个优美、先进的个人信息发布平台。">
         WordPress.org
        </a>
       </li>
      </ul>
     </div>
    </aside>
    <div class="clear">
    </div>
   </div>
   <!--main-->
   ﻿
   <footer id="dibu">
    <div class="about">
     <div class="right">
      <ul class="menu" id="menu-%e5%ba%95%e9%83%a8%e8%8f%9c%e5%8d%95">
       <li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-18024" id="menu-item-18024">
        <a href="http://dataunion.org/category/partners">
         合作伙伴
        </a>
       </li>
       <li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-20881" id="menu-item-20881">
        <a href="http://dataunion.org/contribute">
         文章投稿
        </a>
       </li>
       <li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-20872" id="menu-item-20872">
        <a href="http://dataunion.org/category/%e5%8a%a0%e5%85%a5%e6%95%b0%e7%9b%9f">
         加入数盟
        </a>
       </li>
       <li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-22441" id="menu-item-22441">
        <a href="http://dataunion.org/f-links">
         友情链接
        </a>
       </li>
       <li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-20874" id="menu-item-20874">
        <a href="http://dataunion.org/aboutus">
         关于数盟
        </a>
       </li>
      </ul>
      <p class="banquan">
       数盟社区        ，
        做最棒的数据科学社区
      </p>
     </div>
     <div class="left">
      <ul class="bottomlist">
       <li>
        <a href="http://weibo.com/DataScientistUnion  " target="_blank" 　title="">
         <img src="http://dataunion.org/wp-content/themes/yzipi/images/weibo.png"/>
        </a>
       </li>
       <li>
        <a class="cd-popup-trigger" href="http://dataunion.org/14960.html#0">
         <img src="http://dataunion.org/wp-content/themes/yzipi/images/weixin.png"/>
        </a>
       </li>
      </ul>
      <div class="cd-popup">
       <div class="cd-popup-container">
        <h1>
         扫描二维码,加微信公众号
        </h1>
        <img src="http://dataunion.org/wp-content/themes/yzipi/images/2014-12-06-1515289049.png"/>
        <a class="cd-popup-close" href="http://dataunion.org/14960.html">
        </a>
       </div>
       <!-- cd-popup-container -->
      </div>
      <!-- cd-popup -->
     </div>
    </div>
    <!--about-->
    <div class="bottom">
     <a href="http://dataunion.org/">
      数盟社区
     </a>
     <a href="http://www.miitbeian.gov.cn/" rel="external nofollow" target="_blank">
      京ICP备14026740号
     </a>
     联系我们：
     <a href="mailto:contact@dataunion.org" target="_blank">
      contact@dataunion.org
     </a>
     <div class="tongji">
     </div>
     <!--bottom-->
     <div class="scroll" id="scroll" style="display:none;">
      ︿
     </div>
    </div>
   </footer>
   <!--dibu-->
  </div>
 </body>
</html>